home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / program / 316 / libsrc / fixnum.s < prev    next >
Encoding:
Text File  |  1988-10-20  |  4.7 KB  |  250 lines

  1. # /* Subroutines needed by GCC output code on some machines.  */
  2. # /* Compile this file with the Unix C compiler!  */
  3. # #include "config.h"
  4. # union double_di { double d; int i[2]; };
  5. # union flt_or_int { int i; float f; };
  6. # #ifdef WORDS_BIG_ENDIAN
  7. # #define HIGH 0
  8. # #define LOW 1
  9. # #else
  10. # #define HIGH 1
  11. # #define LOW 0
  12. # #endif
  13. # #ifdef L_umulsi3
  14. # _umulsi3 (a, b)
  15. #      unsigned a, b;
  16. # {
  17. #   return a * b;
  18. # }
  19. # #endif
  20.  
  21. .text
  22.     .even
  23. .globl __umulsi3
  24. __umulsi3:
  25.     link a6,#0        | 0 bytes of local
  26.     movel d2,sp@-        | push d2
  27.     movel a6@(8),d2        | get a
  28.     beq umul_zero        | 0? return 0
  29.     movel a6@(12),d1    | get b
  30.     beq umul_zero        | 0? return 0
  31.  
  32.     mulu d1,d2        | mul bottom parts
  33.     movel d2,d0        | save that
  34.     movew a6@(8),d2        | get hi part of a
  35.     beq umul_1        | zero, skip it
  36.     movel a6@(12),d1    | get b
  37.     mulu d1,d2        | mul a hi by b lo
  38.     lsll #8,d2        | shift over
  39.     lsll #8,d2        |  ...twice...
  40.     addl d2,d0        | add that in
  41. umul_1:
  42.     clrl d1
  43.     movew a6@(12),d1    | get b hi
  44.     beq umul_ret
  45.     movel a6@(8),d2        | and a lo
  46.     mulu d1,d2        | mult those
  47.     lsll #8,d2        | shift it over
  48.     lsll #8,d2        |  ... twice...
  49.     addl d2,d0        | and add that in
  50.     bra umul_ret        | go home
  51. umul_zero:
  52.     clrl d0            | return 0
  53. umul_ret:
  54.     movel sp@+,d2        | get d2 back
  55.  
  56.     unlk a6            | flush frame
  57.     rts
  58. #
  59. # #ifdef L_mulsi3
  60. # _mulsi3 (a, b)
  61. #      int a, b;
  62. # {
  63. #   return a * b;
  64. # }
  65. # #endif
  66.  
  67. .text
  68.     .even
  69. .globl __mulsi3
  70. __mulsi3:
  71.     link a6,#-2        | one word of local
  72.     clrw a6@(-2)        | zap the local; it's our neg flg
  73.  
  74.     movel a6@(12),d0    | get b
  75.     bpl muls1        | pos, ok
  76.     negl d0            | negate it
  77.     addqw #1,a6@(-2)    | and inc the flag
  78. muls1:
  79.     movel d0,sp@-        | push adjusted b
  80.     movel a6@(8),d0        | get a
  81.     bpl muls2        | pos, ok
  82.     negl d0            | negate it
  83.     subqw #1,a6@(-2)    | and dec the flag
  84. muls2:
  85.     movel d0,sp@-        | push adjusted a
  86.     jbsr __umulsi3        | do an unsigned mult
  87.     addql #8,sp        | flush args
  88.     tstw a6@(-2)        | flag set?
  89.     beq muls3        | nope, go ahead and return
  90.     negl d0            | negate the result
  91. muls3:
  92.  
  93.     unlk a6            | unlink the frame
  94.     rts            | done!
  95. #
  96. # #ifdef L_udivsi3
  97. # _udivsi3 (a, b)
  98. #      unsigned a, b;
  99. # {
  100. #   return a / b;
  101. # }
  102. # #endif
  103.  
  104. .text
  105.     .even
  106. .globl __udivsi3
  107. __udivsi3:
  108.     link a6,#0
  109.  
  110.     movel d2,sp@-        | check our bags
  111.     movel d3,sp@-
  112.     movel d4,sp@-
  113.  
  114.     clrl d0            | d0 will be accum
  115.     movel a6@(8),d1        | d1 is a, dividend
  116.     movel a6@(12),d2    | d2 is b, divisor
  117.     movel #1,d3        | get a 1 into bit 0 of bit mask
  118.     movel #31,d4        | d4 is bit num for testing need to sub
  119. udiv_sl:
  120.  
  121.     btst d4,d2        | bit get to top yet?
  122.     bne udiv_sr        | yes, start testing for subtraction
  123.     lsll #1,d3        | shift bitnum left
  124.     lsll #1,d2        | shift divisor left
  125.     bra udiv_sl
  126. udiv_sr:
  127.     cmpl d2,d1        | divisor > dividend?
  128.     beq udiv_sub
  129.     bcs udiv_s
  130. udiv_sub:
  131.     subl d2,d1        | take divisor (shifted) out of dividend
  132.     orl d3,d0        | set this bit in d0
  133.     tstl d1            | anything left?
  134.     beq udiv_done        | nope
  135. udiv_s:
  136.     subql #1,d4        | dec bitnum (new only)
  137.     lsrl #1,d2        | shift right one
  138.     lsrl #1,d3        | and the bitnum too
  139.     bne udiv_sr        | more bits, keep dividing
  140.  
  141. udiv_done:
  142.     movel sp@+,d4
  143.     movel sp@+,d3        | get bags back
  144.     movel sp@+,d2
  145.  
  146.     unlk a6
  147.     rts
  148. #
  149. # #ifdef L_divsi3
  150. # _divsi3 (a, b)
  151. #      int a, b;
  152. # {
  153. #   return a / b;
  154. # }
  155. # #endif
  156.  
  157. .text
  158.     .even
  159. .globl __divsi3
  160. __divsi3:
  161.     link a6,#-2        | 2 bytes of local
  162.     clrw a6@(-2)        | zap the local; it's our neg flg
  163.  
  164.     movel a6@(12),d0    | get b
  165.     bge divs1        | pos, ok
  166.     negl d0            | negate it
  167.     addqw #1,a6@(-2)    | and inc the flag
  168. divs1:
  169.     movel d0,sp@-        | push adjusted b
  170.     movel a6@(8),d0        | get a
  171.     bge divs2        | pos, ok
  172.     negl d0            | negate it
  173.     subqw #1,a6@(-2)    | and dec the flag
  174. divs2:
  175.     movel d0,sp@-        | push adjusted a
  176.     jbsr __udivsi3        | do an unsigned div
  177.     addql #8,sp        | flush args
  178.     tstw a6@(-2)        | flag set?
  179.     beq divs3        | nope, go ahead and return
  180.     negl d0            | negate the result
  181. divs3:
  182.  
  183.     unlk a6            | unlink the frame
  184.     rts            | done!
  185. #
  186. # #ifdef L_umodsi3
  187. # _umodsi3 (a, b)
  188. #      unsigned a, b;
  189. # {
  190. #   return a % b;
  191. # }
  192. # #endif
  193.  
  194. .text
  195.     .even
  196. .globl __umodsi3
  197. __umodsi3:
  198.     link a6,#-4
  199.     movl d2,sp@-
  200.     movel a6@(12),sp@-
  201.     movel a6@(8),sp@-
  202.     jbsr __udivsi3
  203.     movel d0,d0
  204.     movel a6@(12),sp@-
  205.     movel d0,sp@-
  206.     jbsr __mulsi3
  207.     movel d0,d2
  208.     movel a6@(8),d1
  209.     subl d2,d1
  210.     movel d1,a6@(-4)
  211.     movel a6@(-4),d0
  212.     movl a6@(-8),d2
  213.     unlk a6
  214.     rts
  215. # #ifdef L_modsi3
  216. # _modsi3 (a, b)
  217. #      int a, b;
  218. # {
  219. #   return a % b;
  220. # }
  221. # #endif
  222.  
  223. .text
  224.     .even
  225. .globl __modsi3
  226. __modsi3:
  227.     link a6,#-4
  228.     movl d2,sp@-
  229.     movel a6@(12),sp@-
  230.     movel a6@(8),sp@-
  231.     jbsr __divsi3
  232.     movel d0,d0
  233.     movel a6@(12),sp@-
  234.     movel d0,sp@-
  235.     jbsr __mulsi3
  236.     movel d0,d2
  237.     movel a6@(8),d1
  238.     subl d2,d1
  239.     movel d1,a6@(-4)
  240.     movel a6@(-4),d0
  241.     movl a6@(-8),d2
  242.     unlk a6
  243.     rts
  244.  
  245.